# PAL (Programma-Assistito di Modelli Linguistici)
 
import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import PAL from '../../img/pal.png'

[Gao et al., (2022)](https://arxiv.org/abs/2211.10435) presenta un metodo che utilizza gli LLM per leggere problemi in linguaggio naturale e generare programmi come fasi intermedie del ragionamento. Denominato PAL (Program-Aided Language Model), si differenzia dal prompt della catena di pensiero perché, invece di utilizzare il testo in forma libera per ottenere la soluzione, scarica la fase di soluzione su un runtime programmatico, come un interprete Python.

<Screenshot src={PAL} alt="PAL" />
fonte immagine: [Gao et al., (2022)](https://arxiv.org/abs/2211.10435)

Vediamo un esempio che utilizza LangChain e OpenAI GPT-3. Siamo interessati a sviluppare una semplice applicazione che sia in grado di interpretare la domanda posta e fornire una risposta sfruttando l'interprete Python. 

In particolare, siamo interessati a creare una funzionalità che consenta di utilizzare il LLM per rispondere a domande che richiedono la comprensione dei dati. Forniremo al LLM un prompt che include alcuni esempi adottati da [qui](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py).  

Questi sono gli import necessari:

```python
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv
```

Prima di tutto configuriamo alcune variabili:

```python
load_dotenv()

# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")

# for LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
```

Impostazione dell'istanza del modello:


```python
llm = OpenAI(model_name='text-davinci-003', temperature=0)
```

Impostazione prompt + domanda:

```python
question = "Oggi è il 27 febbraio 2023. Sono nato esattamente 25 anni fa. Qual è la data di nascita in MM/DD/YYYY?"."

DATE_UNDERSTANDING_PROMPT = """
# D: Il 2015 si avvicina tra 36 ore. Qual è la data di una settimana da oggi in MM/DD/YYYY?
# Se il 2015 arriverà tra 36 ore, allora oggi è 36 ore prima.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# Una settimana da oggi,
one_week_from_today = today + relativedelta(weeks=1)
# La risposta formattata come %m/%d/%Y è
one_week_from_today.strftime('%m/%d/%Y')
# D: Se il primo giorno del 2019 è un martedì e oggi è il primo lunedì del 2019, allora oggi è 6 giorni dopo.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# La risposta formattata come %m/%d/%Y è
today.strftime('%m/%d/%Y')
# D: Il concerto era previsto per il 06/01/1943, ma è stato posticipato di un giorno a oggi. Qual è la data di 10 giorni fa in MM/DD/YYYY?
# Se il concerto era previsto per il 06/01/1943, ma è stato posticipato di un giorno a oggi, allora oggi è un giorno successivo.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 giorni fa,
ten_days_ago = today - relativedelta(days=10)
# La risposta formattata come %m/%d/%Y è
ten_days_ago.strftime('%m/%d/%Y')
# D: Oggi è il 4/19/1969. Qual è la data di 24 ore dopo in MM/DD/YYYY?
# Oggi è il 4/19/1969.
today = datetime(1969, 4, 19)
# 24 ore dopo,
later = today + relativedelta(hours=24)
# La risposta formattata come %m/%d/%Y è
today.strftime('%m/%d/%Y')
# D: Jane pensava che oggi fosse il 3/11/2002, ma in realtà è il 12 marzo, cioè un giorno dopo. Qual è la data di 24 ore dopo in MM/DD/YYYY?
# Se Jane pensava che oggi fosse il 3/11/2002, ma in realtà è il 12 marzo, allora oggi è il 3/12/2002.
today = datetime(2002, 3, 12)
# 24 hours later,
later = today + relativedelta(hours=24)
# La risposta formattata come %m/%d/%Y è
later.strftime('%m/%d/%Y')
# D: Jane è nata l'ultimo giorno di febbraio del 2001. Oggi compie 16 anni. Qual è la data di ieri in MM/DD/YYYY?
# Se Jane è nata l'ultimo giorno di febbraio del 2001 e oggi compie 16 anni, allora oggi sono passati 16 anni.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Ieri,
yesterday = today - relativedelta(days=1)
# La risposta formattata come %m/%d/%Y è
yesterday.strftime('%m/%d/%Y')
# D: {question}
""".strip() + '\n'
```

```python
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
```

```python
exec(llm_out)
print(born)
```

Si otterrà il seguente risultato: `02/27/1998`
